iconcache: ref textures
authorTimm Bäder <mail@baedert.org>
Sat, 10 Aug 2019 17:36:56 +0000 (19:36 +0200)
committerTimm Bäder <mail@baedert.org>
Sun, 11 Aug 2019 07:05:31 +0000 (09:05 +0200)
We can't just assume that the pointer we'se using as a cache key will
stay unique forever. The texture might be freed, and a later allocated
texture might have the same addres now, causing the cache to return
incorrect results.

gsk/gl/gskgliconcache.c

index bb66e8dfaf43eb01a9aedee85bf0ee18bc450285..4030bf7fbe325d7b4e8e82885ef817275295388f 100644 (file)
@@ -13,11 +13,13 @@ typedef struct
   GskGLTextureAtlas *atlas;
   int frame_age; /* Number of frames this icon is unused */
   guint used: 1;
+  GdkTexture *source_texture;
 } IconData;
 
 static void
 icon_data_free (gpointer p)
 {
+  g_object_unref (((IconData *)p)->source_texture);
   g_free (p);
 }
 
@@ -182,6 +184,7 @@ gsk_gl_icon_cache_lookup_or_add (GskGLIconCache  *self,
     icon_data->atlas = atlas;
     icon_data->frame_age = 0;
     icon_data->used = TRUE;
+    icon_data->source_texture = g_object_ref (texture);
     graphene_rect_init (&icon_data->texture_rect,
                         (float)(packed_x + 1) / atlas->width,
                         (float)(packed_y + 1) / atlas->height,